#include "started_pch.h"
#include "BankC.h"
#include <iostream>

#include "Naming_Service/Naming_Service.h"
#include "ace/streams.h"
#include <iomanip>
using namespace std;

int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) {
    try {
        // Initialize the ORB.
        CORBA::ORB_var orb = CORBA::ORB_init( argc, argv );

		// Get IOR(String) by name service.
		ifstream myfile ("ns.ior");
		CORBA::String_var ior;
		myfile >> ior;
		
		CORBA::Object_var naming_context_object = orb->string_to_object(ior);
		// resolve initial_references by multicast
		CosNaming::NamingContext_var naming_context = CosNaming::NamingContext::_narrow(naming_context_object.in());
		CosNaming::Name name(1);
		name.length(1);
		name[0].id = CORBA::string_dup("ATM");
		
		CORBA::Object_var objRef = naming_context->resolve(name);
		
//		DistributedBuffer::DBuffer_var refBuffer = DistributedBuffer::DBuffer::_narrow(objRef.in());

        Bank_var bank = Bank::_narrow( objRef.in() );
        if( CORBA::is_nil( bank.in() ) ) {
          std::cerr << "IOR was not a Bank object reference." << std::endl;
          return 1;
        }

        int SubOption,j=-1;
        float cantidad;
	    short referencia;
        short destino, servicio, cuenta=-1,nip=-1;
        bool Flag = false;
                    std::cout<<"Ingrese su numero de cuenta:";
                    std::cin>>cuenta;                    
                    std::cout<<"Ingrese su NIP:";
                    std::cin>>nip;
                    /*std::string password;
                    char ch;
                    const char ENTER = 13;
                    while((ch = getch()) != ENTER)
                    {
                        nip += ch;
                        std::cout << '*';
                    }*/
                    if(bank->Autentificacion(cuenta,nip)){
                        while(j!=5){
                        std::cout<<"Elija una opcion:\n\t1) Retiro de efectivo.\n\t2) Consulta de saldo.\n\t";
                        std::cout<<"3) Transferencia de efectivo.\n\t4) Pago de servicio.\n\t5) Salir de este menu.\n";
                        std::cout<<"Opcion: ";
                        std::cin>>SubOption;
                        switch(SubOption){
                        case 1:
                            std::cout<<"\nCantidad:\n\t";
                            std::cin>>cantidad;
                            Flag = bank->retiro(cuenta,cantidad);
                            break;
                        case 2:
                            std::cout<<"\nSaldo: "<<bank->consultaSaldo(cuenta)<<"\n\n";
                            break;
                        case 3:
                            std::cout<<"\nCuenta a depositar:";
                            std::cin>>destino;
                            std::cout<<"Cantidad:\n\t";
                            std::cin>>cantidad;                                        
                            Flag = bank->transferencia(cuenta,destino,cantidad);
                            break;
                        case 4:
                            std::cout<<"\nElija un servicio:\n\t1) GasdeMexico\n\t2) Telcel\n\t3) Cablevision\n\t4) Telmex\n\t5) Banamex\n\t6) CFE\n";
                            std::cin>>servicio;
                            std::cout<<"Cantidad:\n\t";
                            std::cin>>cantidad;
                            std::cout<<"Referencia:\n\t";
                            std::cin>>referencia;

                                if (bank->retiro(cuenta,cantidad)){
                                    bool pagoS =bank->pagoServicios(servicio,cantidad,referencia);
                                        	std::cout<<"Su numero de referencia del pago es: "<<pagoS<<"\n\t";
                                }
                                else
                                    std::cout<<"Fondos insuficientes";
                               break;
                        case 5:
                                j=5;
                                break;                                                                                                                                                            
                        }
                                if(Flag){
                                    cout<<"Operacion realizada correctamente.\n\t";
                                }else{
                                    cout<<"Ocurrio un error al realizar la operacion.\n\t";
                                }
                            }
                        }else{
				std::cout<<"\n¡Usuario no autentificado!\n";
				std::cout<<"Por favor, vuelva a digitar el no.cuenta y nip\n\n";
			}
    // Finally CORBA client
    orb->destroy();
    return 0;
    } catch(const CORBA::Exception& ex) {
        std::cerr << "CORBA exception: " << ex << std::endl;
    }
      return 1;
}
